--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
LXMF/LXMF.py 9a75b9c1ecc96c8df051efb95a26842e5b39dabe (9a75b9c1) Text, 74.74 KB
Tff7b72import T7ee787os
Tff7b72import T7ee787math
Tff7b72import T7ee787time
Tff7b72import T7ee787random
Tff7b72import T7ee787atexit
Tff7b72import T7ee787threading
Tff7b72import T7ee787RNS
Tff7b72import T7ee787RNST7ee787.T7ee787vendorT7ee787.T7ee787umsgpack Tff7b72as T7ee787msgpack
Te6edf3APP_NAME Tff7b72= Ta5d6ff"Ta5d6fflxmfTa5d6ff"
Tff7b72class T56d364LXMessageTb4b4b4:
Te6edf3DRAFT Tff7b72= T79c0ff0x00
Te6edf3OUTBOUND Tff7b72= T79c0ff0x01
Te6edf3SENDING Tff7b72= T79c0ff0x02
Te6edf3SENT Tff7b72= T79c0ff0x04
Te6edf3DELIVERED Tff7b72= T79c0ff0x08
Te6edf3FAILED Tff7b72= T79c0ff0xFF
Te6edf3states Tff7b72= Tb4b4b4[Te6edf3DRAFTTb4b4b4, Te6edf3OUTBOUNDTb4b4b4, Te6edf3SENDINGTb4b4b4, Te6edf3SENTTb4b4b4, Te6edf3DELIVEREDTb4b4b4, Te6edf3FAILEDTb4b4b4]
Te6edf3UNKNOWN Tff7b72= T79c0ff0x00
Te6edf3PACKET Tff7b72= T79c0ff0x01
Te6edf3RESOURCE Tff7b72= T79c0ff0x02
Te6edf3representations Tff7b72= Tb4b4b4[Te6edf3UNKNOWNTb4b4b4, Te6edf3PACKETTb4b4b4, Te6edf3RESOURCETb4b4b4]
Te6edf3OPPORTUNISTIC Tff7b72= T79c0ff0x01
Te6edf3DIRECT Tff7b72= T79c0ff0x02
Te6edf3PROPAGATED Tff7b72= T79c0ff0x03
Te6edf3valid_methods Tff7b72= Tb4b4b4[Te6edf3OPPORTUNISTICTb4b4b4, Te6edf3DIRECTTb4b4b4, Te6edf3PROPAGATEDTb4b4b4]
Te6edf3SOURCE_UNKNOWN Tff7b72= T79c0ff0x01
Te6edf3SIGNATURE_INVALID Tff7b72= T79c0ff0x02
Te6edf3unverified_reasons Tff7b72= Tb4b4b4[Te6edf3SOURCE_UNKNOWNTb4b4b4, Te6edf3SIGNATURE_INVALIDTb4b4b4]
Te6edf3DESTINATION_LENGTH Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8
Te6edf3SIGNATURE_LENGTH Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffSIGLENGTHTff7b72/Tff7b72/T79c0ff8
T8b949e# LXMF overhead is 99 bytes per message:
T8b949e# 10 bytes for destination hash
T8b949e# 10 bytes for source hash
T8b949e# 64 bytes for Ed25519 signature
T8b949e# 8 bytes for timestamp
T8b949e# 7 bytes for msgpack structure
Te6edf3LXMF_OVERHEAD Tff7b72= T79c0ff2Tff7b72*Te6edf3DESTINATION_LENGTH Tff7b72+ Te6edf3SIGNATURE_LENGTH Tff7b72+ T79c0ff8 Tff7b72+ T79c0ff7
T8b949e# With an MTU of 500, the maximum amount of data
T8b949e# we can send in a single encrypted packet is
T8b949e# 383 bytes.
Te6edf3ENCRYPTED_PACKET_MDU Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffENCRYPTED_MDU
T8b949e# The max content length we can fit in LXMF message
T8b949e# inside a single RNS packet is the encrypted MDU, minus
T8b949e# the LXMF overhead. We can optimise a bit though, by
T8b949e# inferring the destination hash from the destination
T8b949e# field of the packet, therefore we also add the length
T8b949e# of a destination hash to the calculation. With default
T8b949e# RNS and LXMF parameters, the largest single-packet
T8b949e# LXMF message we can send is 294 bytes. If a message
T8b949e# is larger than that, a Reticulum link will be used.
Te6edf3ENCRYPTED_PACKET_MAX_CONTENT Tff7b72= Te6edf3ENCRYPTED_PACKET_MDU Tff7b72- Te6edf3LXMF_OVERHEAD Tff7b72+ Te6edf3DESTINATION_LENGTH
T8b949e# Links can carry a larger MDU, due to less overhead per
T8b949e# packet. The link MDU with default Reticulum parameters
T8b949e# is 431 bytes.
Te6edf3LINK_PACKET_MDU Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffMDU
T8b949e# Which means that we can deliver single-packet LXMF
T8b949e# messages with content of up to 332 bytes over a link.
T8b949e# If a message is larger than that, LXMF will sequence
T8b949e# and transfer it as a RNS resource over the link instead.
Te6edf3LINK_PACKET_MAX_CONTENT Tff7b72= Te6edf3LINK_PACKET_MDU Tff7b72- Te6edf3LXMF_OVERHEAD
T8b949e# For plain packets without encryption, we can
T8b949e# fit up to 388 bytes of content.
Te6edf3PLAIN_PACKET_MDU Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffPLAIN_MDU
Te6edf3PLAIN_PACKET_MAX_CONTENT Tff7b72= Te6edf3PLAIN_PACKET_MDU Tff7b72- Te6edf3LXMF_OVERHEAD Tff7b72+ Te6edf3DESTINATION_LENGTH
T8b949e# Descriptive strings regarding transport encryption
Te6edf3ENCRYPTION_DESCRIPTION_AES Tff7b72= Ta5d6ff"Ta5d6ffAES-128Ta5d6ff"
Te6edf3ENCRYPTION_DESCRIPTION_EC Tff7b72= Ta5d6ff"Ta5d6ffCurve25519Ta5d6ff"
Te6edf3ENCRYPTION_DESCRIPTION_UNENCRYPTED Tff7b72= Ta5d6ff"Ta5d6ffUnencryptedTa5d6ff"
Tff7b72def Tff7b72__str__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffhash Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff<LXMessage Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhashTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff>Ta5d6ff"
Tff7b72elseTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff<LXMessage>Ta5d6ff"
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destinationTb4b4b4, Te6edf3sourceTb4b4b4, Te6edf3content Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4, Te6edf3title Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4, Te6edf3fields Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3desired_method Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3destination_hash Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3source_hash Tff7b72= Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3destinationTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4) Tff7b72or Te6edf3destination Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__destination Tff7b72= Te6edf3destination
Tff7b72if Te6edf3destination Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdestination_hash Tff7b72= Te6edf3destinationTff7b72.Td2a8ffhash
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdestination_hash Tff7b72= Te6edf3destination_hash
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffLXMessage initialised with invalid destinationTa5d6ff"Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3sourceTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4) Tff7b72or Te6edf3source Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__source Tff7b72= Te6edf3source
Tff7b72if Te6edf3source Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsource_hash Tff7b72= Te6edf3sourceTff7b72.Td2a8ffhash
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsource_hash Tff7b72= Te6edf3source_hash
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffLXMessage initialised with invalid sourceTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffset_title_from_stringTb4b4b4(Te6edf3titleTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffset_content_from_stringTb4b4b4(Te6edf3contentTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffset_fieldsTb4b4b4(Te6edf3fieldsTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpayload Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fftimestamp Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffsignature Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffhash Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffpacked Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffprogress Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffDRAFT
Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffUNKNOWN
Tff7b72selfTff7b72.Td2a8ffincoming Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffsignature_validated Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffunverified_reason Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffrepresentation Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffUNKNOWN
Tff7b72selfTff7b72.Td2a8ffdesired_method Tff7b72= Te6edf3desired_method
Tff7b72selfTff7b72.Td2a8ffdelivery_attempts Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8fftransport_encrypted Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8fftransport_encryption Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffpacket_representation Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffresource_representation Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff__delivery_destination Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff__delivery_callback Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fffailed_callback Tff7b72= Tff7b72None
Tff7b72def Td2a8ffset_title_from_stringTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3title_stringTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fftitle Tff7b72= Te6edf3title_stringTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffset_title_from_bytesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3title_bytesTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fftitle Tff7b72= Te6edf3title_bytes
Tff7b72def Td2a8fftitle_as_stringTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8fftitleTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffset_content_from_stringTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3content_stringTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcontent Tff7b72= Te6edf3content_stringTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffset_content_from_bytesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3content_bytesTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcontent Tff7b72= Te6edf3content_bytes
Tff7b72def Td2a8ffcontent_as_stringTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffcontentTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffset_fieldsTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3fieldsTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3fieldsTb4b4b4, Tffa657dictTb4b4b4) Tff7b72or Te6edf3fields Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8fffields Tff7b72= Te6edf3fields
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffLXMessage property Tffea00\"Ta5d6fffieldsTffea00\"Ta5d6ff can only be dict or NoneTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffget_fieldsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff__fields
Tff7b72def Td2a8ffset_destinationTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destinationTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdestination Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3destinationTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__destination Tff7b72= Te6edf3destination
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid destination set on LXMessageTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffCannot reassign destination on LXMessageTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffget_destinationTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff__destination
Tff7b72def Td2a8ffset_sourceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sourceTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsource Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3sourceTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__source Tff7b72= Te6edf3source
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid source set on LXMessageTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffCannot reassign source on LXMessageTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffget_sourceTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff__source
Tff7b72def Td2a8ffset_delivery_destinationTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3delivery_destinationTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__delivery_destination Tff7b72= Te6edf3delivery_destination
Tff7b72def Td2a8ffregister_delivery_callbackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3callbackTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__delivery_callback Tff7b72= Te6edf3callback
Tff7b72def Td2a8ffregister_failed_callbackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3callbackTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fffailed_callback Tff7b72= Te6edf3callback
Tff7b72def Td2a8ffpackTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffpackedTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fftimestamp Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftimestamp Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpropagation_packed Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffpayload Tff7b72= Tb4b4b4[Tff7b72selfTff7b72.Td2a8fftimestampTb4b4b4, Tff7b72selfTff7b72.Td2a8fftitleTb4b4b4, Tff7b72selfTff7b72.Td2a8ffcontentTb4b4b4, Tff7b72selfTff7b72.Td2a8fffieldsTb4b4b4]
Te6edf3hashed_part Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Te6edf3hashed_part Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ff__destinationTff7b72.Td2a8ffhash
Te6edf3hashed_part Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ff__sourceTff7b72.Td2a8ffhash
Te6edf3hashed_part Tff7b72+Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpayloadTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffhash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3hashed_partTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmessage_id Tff7b72= Tff7b72selfTff7b72.Td2a8ffhash
Te6edf3signed_part Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Te6edf3signed_part Tff7b72+Tff7b72= Te6edf3hashed_part
Te6edf3signed_part Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffhash
Tff7b72selfTff7b72.Td2a8ffsignature Tff7b72= Tff7b72selfTff7b72.Td2a8ff__sourceTff7b72.Td2a8ffsignTb4b4b4(Te6edf3signed_partTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsignature_validated Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffpacked Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ffpacked Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ff__destinationTff7b72.Td2a8ffhash
Tff7b72selfTff7b72.Td2a8ffpacked Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ff__sourceTff7b72.Td2a8ffhash
Tff7b72selfTff7b72.Td2a8ffpacked Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffsignature
Te6edf3packed_payload Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpayloadTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpacked Tff7b72+Tff7b72= Te6edf3packed_payload
Tff7b72selfTff7b72.Td2a8ffpacked_size Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpackedTb4b4b4)
Te6edf3content_size Tff7b72= Tffa657lenTb4b4b4(Te6edf3packed_payloadTb4b4b4)
T8b949e# If no desired delivery method has been defined,
T8b949e# one will be chosen according to these rules:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdesired_method Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdesired_method Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffDIRECT
T8b949e# TODO: Expand rules to something more intelligent
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdesired_method Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffOPPORTUNISTICTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff__destinationTff7b72.Td2a8fftype Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4:
Te6edf3single_packet_content_limit Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffENCRYPTED_PACKET_MAX_CONTENT
Tff7b72elif Tff7b72selfTff7b72.Td2a8ff__destinationTff7b72.Td2a8fftype Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffPLAINTb4b4b4:
Te6edf3single_packet_content_limit Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffPLAIN_PACKET_MAX_CONTENT
Tff7b72if Te6edf3content_size Tff7b72> Te6edf3single_packet_content_limitTb4b4b4:
Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff"Ta5d6ffLXMessage desired opportunistic delivery method, but content exceeds single-packet size.Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffOPPORTUNISTIC
Tff7b72selfTff7b72.Td2a8ffrepresentation Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffPACKET
Tff7b72selfTff7b72.Td2a8ff__delivery_destination Tff7b72= Tff7b72selfTff7b72.Td2a8ff__destination
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffdesired_method Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffDIRECTTb4b4b4:
Te6edf3single_packet_content_limit Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffLINK_PACKET_MAX_CONTENT
Tff7b72if Te6edf3content_size Tff7b72<Tff7b72= Te6edf3single_packet_content_limitTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72= Tff7b72selfTff7b72.Td2a8ffdesired_method
Tff7b72selfTff7b72.Td2a8ffrepresentation Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffPACKET
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72= Tff7b72selfTff7b72.Td2a8ffdesired_method
Tff7b72selfTff7b72.Td2a8ffrepresentation Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffRESOURCE
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffdesired_method Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffPROPAGATEDTb4b4b4:
Te6edf3single_packet_content_limit Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffLINK_PACKET_MAX_CONTENT
Te6edf3encrypted_data Tff7b72= Tff7b72selfTff7b72.Td2a8ff__destinationTff7b72.Td2a8ffencryptTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpackedTb4b4b4[Te6edf3LXMessageTff7b72.Td2a8ffDESTINATION_LENGTHTb4b4b4:Tb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpropagation_packed Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4[Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4, Tb4b4b4[Tff7b72selfTff7b72.Td2a8ffpackedTb4b4b4[Tb4b4b4:Te6edf3LXMessageTff7b72.Td2a8ffDESTINATION_LENGTHTb4b4b4]Tff7b72+Te6edf3encrypted_dataTb4b4b4]Tb4b4b4]Tb4b4b4)
Te6edf3content_size Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpropagation_packedTb4b4b4)
Tff7b72if Te6edf3content_size Tff7b72<Tff7b72= Te6edf3single_packet_content_limitTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72= Tff7b72selfTff7b72.Td2a8ffdesired_method
Tff7b72selfTff7b72.Td2a8ffrepresentation Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffPACKET
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72= Tff7b72selfTff7b72.Td2a8ffdesired_method
Tff7b72selfTff7b72.Td2a8ffrepresentation Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffRESOURCE
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffAttempt to re-pack LXMessage Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff that was already packedTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffsendTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdetermine_transport_encryptionTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffOPPORTUNISTICTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__as_packetTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffset_delivery_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff__mark_deliveredTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffSENT
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffDIRECTTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffSENDING
Tff7b72if Tff7b72selfTff7b72.Td2a8ffrepresentation Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffPACKETTb4b4b4:
Te6edf3receipt Tff7b72= Tff7b72selfTff7b72.Td2a8ff__as_packetTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Te6edf3receiptTff7b72.Td2a8ffset_delivery_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff__mark_deliveredTb4b4b4)
Te6edf3receiptTff7b72.Td2a8ffset_timeout_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff__link_packet_timed_outTb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffrepresentation Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffRESOURCETb4b4b4:
Tff7b72selfTff7b72.Td2a8ffresource_representation Tff7b72= Tff7b72selfTff7b72.Td2a8ff__as_resourceTb4b4b4(Tb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffPROPAGATEDTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffSENDING
Tff7b72if Tff7b72selfTff7b72.Td2a8ffrepresentation Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffPACKETTb4b4b4:
Te6edf3receipt Tff7b72= Tff7b72selfTff7b72.Td2a8ff__as_packetTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3receiptTb4b4b4:
Te6edf3receiptTff7b72.Td2a8ffset_delivery_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff__mark_propagatedTb4b4b4)
Te6edf3receiptTff7b72.Td2a8ffset_timeout_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff__link_packet_timed_outTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__delivery_destinationTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffrepresentation Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffRESOURCETb4b4b4:
Tff7b72selfTff7b72.Td2a8ffresource_representation Tff7b72= Tff7b72selfTff7b72.Td2a8ff__as_resourceTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffdetermine_transport_encryptionTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffOPPORTUNISTICTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff__destinationTff7b72.Td2a8fftype Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4:
Tff7b72selfTff7b72.Td2a8fftransport_encrypted Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8fftransport_encryption Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffENCRYPTION_DESCRIPTION_EC
Tff7b72elif Te6edf3destination_type Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffGROUPTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftransport_encrypted Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8fftransport_encryption Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffENCRYPTION_DESCRIPTION_AES
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftransport_encrypted Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8fftransport_encryption Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffENCRYPTION_DESCRIPTION_UNENCRYPTED
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffDIRECTTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftransport_encrypted Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8fftransport_encryption Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffENCRYPTION_DESCRIPTION_EC
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffPROPAGATEDTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff__destinationTff7b72.Td2a8fftype Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4:
Tff7b72selfTff7b72.Td2a8fftransport_encrypted Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8fftransport_encryption Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffENCRYPTION_DESCRIPTION_EC
Tff7b72elif Tff7b72selfTff7b72.Td2a8ff__destinationTff7b72.Td2a8fftype Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffGROUPTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftransport_encrypted Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8fftransport_encryption Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffENCRYPTION_DESCRIPTION_AES
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftransport_encrypted Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8fftransport_encryption Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffENCRYPTION_DESCRIPTION_UNENCRYPTED
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftransport_encrypted Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8fftransport_encryption Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffENCRYPTION_DESCRIPTION_UNENCRYPTED
Tff7b72def Td2a8ff__mark_deliveredTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3receipt Tff7b72= Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReceived delivery notification for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffDELIVERED
Tff7b72if Tff7b72selfTff7b72.Td2a8ff__delivery_callback Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__delivery_callbackTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72def Td2a8ff__mark_propagatedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3receipt Tff7b72= Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReceived propagation success notification for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffSENT
Tff7b72if Tff7b72selfTff7b72.Td2a8ff__delivery_callback Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__delivery_callbackTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72def Td2a8ff__resource_concludedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3resourceTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3resourceTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__mark_deliveredTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3resourceTff7b72.Td2a8fflinkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffOUTBOUND
Tff7b72def Td2a8ff__propagation_resource_concludedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3resourceTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3resourceTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__mark_propagatedTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3resourceTff7b72.Td2a8fflinkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffOUTBOUND
Tff7b72def Td2a8ff__link_packet_timed_outTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3packet_receiptTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3packet_receiptTb4b4b4:
Te6edf3packet_receiptTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffOUTBOUND
Tff7b72def Td2a8ff__update_transfer_progressTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3resourceTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffprogress Tff7b72= Te6edf3resourceTff7b72.Td2a8ffget_progressTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff__as_packetTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffpackedTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff__delivery_destinationTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffCanTa5d6ff'Ta5d6fft synthesize packet for LXMF message before delivery destination is knownTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffOPPORTUNISTICTb4b4b4:
Tff7b72return Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Tff7b72selfTff7b72.Td2a8ff__delivery_destinationTb4b4b4, Tff7b72selfTff7b72.Td2a8ffpackedTb4b4b4[Te6edf3LXMessageTff7b72.Td2a8ffDESTINATION_LENGTHTb4b4b4:Tb4b4b4]Tb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffDIRECTTb4b4b4:
Tff7b72return Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Tff7b72selfTff7b72.Td2a8ff__delivery_destinationTb4b4b4, Tff7b72selfTff7b72.Td2a8ffpackedTb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffPROPAGATEDTb4b4b4:
Tff7b72return Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Tff7b72selfTff7b72.Td2a8ff__delivery_destinationTb4b4b4, Tff7b72selfTff7b72.Td2a8ffpropagation_packedTb4b4b4)
Tff7b72def Td2a8ff__as_resourceTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffpackedTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff__delivery_destinationTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffCanTa5d6ff'Ta5d6fft synthesize resource for LXMF message before delivery destination is knownTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff__delivery_destinationTff7b72.Td2a8fftype Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffLINKTb4b4b4:
Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff"Ta5d6ffTried to synthesize resource for LXMF message on a delivery destination that was not a linkTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff__delivery_destinationTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4:
Tff7b72raise Tf85149ConnectionErrorTb4b4b4(Ta5d6ff"Ta5d6ffTried to synthesize resource for LXMF message on a link that was not activeTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffprogress Tff7b72= T79c0ff0.0
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffDIRECTTb4b4b4:
Tff7b72return Te6edf3RNSTff7b72.Td2a8ffResourceTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpackedTb4b4b4, Tff7b72selfTff7b72.Td2a8ff__delivery_destinationTb4b4b4, Te6edf3callback Tff7b72= Tff7b72selfTff7b72.Td2a8ff__resource_concludedTb4b4b4, Te6edf3progress_callback Tff7b72= Tff7b72selfTff7b72.Td2a8ff__update_transfer_progressTb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmethod Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffPROPAGATEDTb4b4b4:
Tff7b72return Te6edf3RNSTff7b72.Td2a8ffResourceTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpropagation_packedTb4b4b4, Tff7b72selfTff7b72.Td2a8ff__delivery_destinationTb4b4b4, Te6edf3callback Tff7b72= Tff7b72selfTff7b72.Td2a8ff__propagation_resource_concludedTb4b4b4, Te6edf3progress_callback Tff7b72= Tff7b72selfTff7b72.Td2a8ff__update_transfer_progressTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72def Td2a8ffwrite_to_directoryTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3directory_pathTb4b4b4)Tb4b4b4:
Te6edf3file_name Tff7b72= Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhashTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3file_path Tff7b72= Te6edf3directory_pathTff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Te6edf3file_name
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffpackedTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)
Te6edf3container Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffstateTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffstateTb4b4b4,
Ta5d6ff"Ta5d6fflxmf_bytesTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffpackedTb4b4b4,
Ta5d6ff"Ta5d6fftransport_encryptedTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8fftransport_encryptedTb4b4b4,
Ta5d6ff"Ta5d6fftransport_encryptionTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8fftransport_encryptionTb4b4b4,
Ta5d6ff"Ta5d6ffmethodTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffmethod
Tb4b4b4}
Te6edf3packed_container Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Te6edf3containerTb4b4b4)
Te6edf3file Tff7b72= Tffa657openTb4b4b4(Te6edf3file_pathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4)
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3packed_containerTb4b4b4)
Te6edf3fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3file_path
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while writing LXMF message to file Tffea00\"Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3file_pathTb4b4b4)Tff7b72+Ta5d6ff"Tffea00\"Ta5d6ff. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72None
Tf0883e@staticmethod
Tff7b72def Td2a8ffunpack_from_bytesTb4b4b4(Te6edf3lxmf_bytesTb4b4b4)Tb4b4b4:
Te6edf3destination_hash Tff7b72= Te6edf3lxmf_bytesTb4b4b4[Tb4b4b4:Te6edf3LXMessageTff7b72.Td2a8ffDESTINATION_LENGTHTb4b4b4]
Te6edf3source_hash Tff7b72= Te6edf3lxmf_bytesTb4b4b4[Te6edf3LXMessageTff7b72.Td2a8ffDESTINATION_LENGTHTb4b4b4:T79c0ff2Tff7b72*Te6edf3LXMessageTff7b72.Td2a8ffDESTINATION_LENGTHTb4b4b4]
Te6edf3signature Tff7b72= Te6edf3lxmf_bytesTb4b4b4[T79c0ff2Tff7b72*Te6edf3LXMessageTff7b72.Td2a8ffDESTINATION_LENGTHTb4b4b4:T79c0ff2Tff7b72*Te6edf3LXMessageTff7b72.Td2a8ffDESTINATION_LENGTHTff7b72+Te6edf3LXMessageTff7b72.Td2a8ffSIGNATURE_LENGTHTb4b4b4]
Te6edf3packed_payload Tff7b72= Te6edf3lxmf_bytesTb4b4b4[T79c0ff2Tff7b72*Te6edf3LXMessageTff7b72.Td2a8ffDESTINATION_LENGTHTff7b72+Te6edf3LXMessageTff7b72.Td2a8ffSIGNATURE_LENGTHTb4b4b4:Tb4b4b4]
Te6edf3hashed_part Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff" Tff7b72+ Te6edf3destination_hash Tff7b72+ Te6edf3source_hash Tff7b72+ Te6edf3packed_payload
Te6edf3message_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3hashed_partTb4b4b4)
Te6edf3signed_part Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff" Tff7b72+ Te6edf3hashed_part Tff7b72+ Te6edf3message_hash
Te6edf3unpacked_payload Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3packed_payloadTb4b4b4)
Te6edf3timestamp Tff7b72= Te6edf3unpacked_payloadTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3title_bytes Tff7b72= Te6edf3unpacked_payloadTb4b4b4[T79c0ff1Tb4b4b4]
Te6edf3content_bytes Tff7b72= Te6edf3unpacked_payloadTb4b4b4[T79c0ff2Tb4b4b4]
Te6edf3fields Tff7b72= Te6edf3unpacked_payloadTb4b4b4[T79c0ff3Tb4b4b4]
Te6edf3destination_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72if Te6edf3destination_identity Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3destination_identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6ffdeliveryTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3destination Tff7b72= Tff7b72None
Te6edf3source_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3source_hashTb4b4b4)
Tff7b72if Te6edf3source_identity Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3source Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3source_identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6ffdeliveryTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3source Tff7b72= Tff7b72None
Te6edf3message Tff7b72= Te6edf3LXMessageTb4b4b4(
Te6edf3destination Tff7b72= Te6edf3destinationTb4b4b4,
Te6edf3source Tff7b72= Te6edf3sourceTb4b4b4,
Te6edf3content Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3title Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3fields Tff7b72= Te6edf3fieldsTb4b4b4,
Te6edf3destination_hash Tff7b72= Te6edf3destination_hashTb4b4b4,
Te6edf3source_hash Tff7b72= Te6edf3source_hashTb4b4b4)
Te6edf3messageTff7b72.Td2a8ffhash Tff7b72= Te6edf3message_hash
Te6edf3messageTff7b72.Td2a8ffsignature Tff7b72= Te6edf3signature
Te6edf3messageTff7b72.Td2a8ffincoming Tff7b72= Tff7b72True
Te6edf3messageTff7b72.Td2a8fftimestamp Tff7b72= Te6edf3timestamp
Te6edf3messageTff7b72.Td2a8ffpacked Tff7b72= Te6edf3lxmf_bytes
Te6edf3messageTff7b72.Td2a8ffpacked_size Tff7b72= Tffa657lenTb4b4b4(Te6edf3lxmf_bytesTb4b4b4)
Te6edf3messageTff7b72.Td2a8ffset_title_from_bytesTb4b4b4(Te6edf3title_bytesTb4b4b4)
Te6edf3messageTff7b72.Td2a8ffset_content_from_bytesTb4b4b4(Te6edf3content_bytesTb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3sourceTb4b4b4:
Tff7b72if Te6edf3sourceTff7b72.Td2a8ffidentityTff7b72.Td2a8ffvalidateTb4b4b4(Te6edf3signatureTb4b4b4, Te6edf3signed_partTb4b4b4)Tb4b4b4:
Te6edf3messageTff7b72.Td2a8ffsignature_validated Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
Te6edf3messageTff7b72.Td2a8ffsignature_validated Tff7b72= Tff7b72False
Te6edf3messageTff7b72.Td2a8ffunverified_reason Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffSIGNATURE_INVALID
Tff7b72elseTb4b4b4:
Te6edf3signature_validated Tff7b72= Tff7b72False
Te6edf3messageTff7b72.Td2a8ffunverified_reason Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffSOURCE_UNKNOWN
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffUnpacked LXMF message signature could not be validated, since source identity is unknownTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3messageTff7b72.Td2a8ffsignature_validated Tff7b72= Tff7b72False
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while validating LXMF message signature. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Te6edf3message
Tf0883e@staticmethod
Tff7b72def Td2a8ffunpack_from_fileTb4b4b4(Te6edf3lxmf_file_handleTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3container Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3lxmf_file_handleTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3lxm Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffunpack_from_bytesTb4b4b4(Te6edf3containerTb4b4b4[Ta5d6ff"Ta5d6fflxmf_bytesTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffstateTa5d6ff" Tff7b72in Te6edf3containerTb4b4b4:
Te6edf3lxmTff7b72.Td2a8ffstate Tff7b72= Te6edf3containerTb4b4b4[Ta5d6ff"Ta5d6ffstateTa5d6ff"Tb4b4b4]
Tff7b72if Ta5d6ff"Ta5d6fftransport_encryptedTa5d6ff" Tff7b72in Te6edf3containerTb4b4b4:
Te6edf3lxmTff7b72.Td2a8fftransport_encrypted Tff7b72= Te6edf3containerTb4b4b4[Ta5d6ff"Ta5d6fftransport_encryptedTa5d6ff"Tb4b4b4]
Tff7b72if Ta5d6ff"Ta5d6fftransport_encryptionTa5d6ff" Tff7b72in Te6edf3containerTb4b4b4:
Te6edf3lxmTff7b72.Td2a8fftransport_encryption Tff7b72= Te6edf3containerTb4b4b4[Ta5d6ff"Ta5d6fftransport_encryptionTa5d6ff"Tb4b4b4]
Tff7b72if Ta5d6ff"Ta5d6ffmethodTa5d6ff" Tff7b72in Te6edf3containerTb4b4b4:
Te6edf3lxmTff7b72.Td2a8ffmethod Tff7b72= Te6edf3containerTb4b4b4[Ta5d6ff"Ta5d6ffmethodTa5d6ff"Tb4b4b4]
Tff7b72return Te6edf3lxm
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not unpack LXMessage from file. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72None
Tff7b72class T56d364LXMFDeliveryAnnounceHandlerTb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3lxmrouterTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffaspect_filter Tff7b72= Te6edf3APP_NAMETff7b72+Ta5d6ff"Ta5d6ff.deliveryTa5d6ff"
Tff7b72selfTff7b72.Td2a8fflxmrouter Tff7b72= Te6edf3lxmrouter
Tff7b72def Td2a8ffreceived_announceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destination_hashTb4b4b4, Te6edf3announced_identityTb4b4b4, Te6edf3app_dataTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3lxmessage Tff7b72in Tff7b72selfTff7b72.Td2a8fflxmrouterTff7b72.Td2a8ffpending_outboundTb4b4b4:
Tff7b72if Te6edf3destination_hash Tff7b72== Te6edf3lxmessageTff7b72.Td2a8ffdestination_hashTb4b4b4:
Tff7b72if Te6edf3lxmessageTff7b72.Td2a8ffmethod Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffDIRECTTb4b4b4:
Te6edf3lxmessageTff7b72.Td2a8ffnext_delivery_attempt Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72while Tff7b72selfTff7b72.Td2a8fflxmrouterTff7b72.Td2a8ffprocessing_outboundTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflxmrouterTff7b72.Td2a8ffprocess_outboundTb4b4b4(Tb4b4b4)
Tff7b72class T56d364LXMFPropagationAnnounceHandlerTb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3lxmrouterTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffaspect_filter Tff7b72= Te6edf3APP_NAMETff7b72+Ta5d6ff"Ta5d6ff.propagationTa5d6ff"
Tff7b72selfTff7b72.Td2a8fflxmrouter Tff7b72= Te6edf3lxmrouter
Tff7b72def Td2a8ffreceived_announceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destination_hashTb4b4b4, Te6edf3announced_identityTb4b4b4, Te6edf3app_dataTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tffa657typeTb4b4b4(Te6edf3app_dataTb4b4b4) Tff7b72== Tffa657bytesTb4b4b4:
Te6edf3data Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3app_dataTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8fflxmrouterTff7b72.Td2a8ffpropagation_node Tff7b72and Tff7b72selfTff7b72.Td2a8fflxmrouterTff7b72.Td2a8ffautopeerTb4b4b4:
Tff7b72if Te6edf3dataTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Tff7b72TrueTb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhops_toTb4b4b4(Te6edf3destination_hashTb4b4b4) Tff7b72<Tff7b72= Tff7b72selfTff7b72.Td2a8fflxmrouterTff7b72.Td2a8ffautopeer_maxdepthTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflxmrouterTff7b72.Td2a8ffpeerTb4b4b4(Te6edf3destination_hashTb4b4b4, Te6edf3dataTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)
Tff7b72elif Te6edf3dataTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Tff7b72FalseTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflxmrouterTff7b72.Td2a8ffunpeerTb4b4b4(Te6edf3destination_hashTb4b4b4, Te6edf3dataTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while evaluating propagation node announce, ignoring announce.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72class T56d364LXMPeerTb4b4b4:
Te6edf3OFFER_REQUEST_PATH Tff7b72= Ta5d6ff"Ta5d6ff/offerTa5d6ff"
Te6edf3MESSAGE_GET_PATH Tff7b72= Ta5d6ff"Ta5d6ff/getTa5d6ff"
Te6edf3IDLE Tff7b72= T79c0ff0x00
Te6edf3LINK_ESTABLISHING Tff7b72= T79c0ff0x01
Te6edf3LINK_READY Tff7b72= T79c0ff0x02
Te6edf3REQUEST_SENT Tff7b72= T79c0ff0x03
Te6edf3RESPONSE_RECEIVED Tff7b72= T79c0ff0x04
Te6edf3RESOURCE_TRANSFERRING Tff7b72= T79c0ff0x05
Te6edf3ERROR_NO_IDENTITY Tff7b72= T79c0ff0xf0
Tf0883e@staticmethod
Tff7b72def Td2a8fffrom_bytesTb4b4b4(Te6edf3peer_bytesTb4b4b4, Te6edf3routerTb4b4b4)Tb4b4b4:
Te6edf3dictionary Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3peer_bytesTb4b4b4)
Te6edf3peer Tff7b72= Te6edf3LXMPeerTb4b4b4(Te6edf3routerTb4b4b4, Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4]Tb4b4b4)
Te6edf3peerTff7b72.Td2a8ffpeering_timebase Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffpeering_timebaseTa5d6ff"Tb4b4b4]
Te6edf3peerTff7b72.Td2a8ffalive Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffaliveTa5d6ff"Tb4b4b4]
Te6edf3peerTff7b72.Td2a8fflast_heard Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6fflast_heardTa5d6ff"Tb4b4b4]
Tff7b72for Te6edf3transient_id Tff7b72in Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffhandled_idsTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3transient_id Tff7b72in Te6edf3routerTff7b72.Td2a8ffpropagation_entriesTb4b4b4:
Te6edf3peerTff7b72.Td2a8ffhandled_messagesTb4b4b4[Te6edf3transient_idTb4b4b4] Tff7b72= Te6edf3routerTff7b72.Td2a8ffpropagation_entriesTb4b4b4[Te6edf3transient_idTb4b4b4]
Tff7b72for Te6edf3transient_id Tff7b72in Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffunhandled_idsTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3transient_id Tff7b72in Te6edf3routerTff7b72.Td2a8ffpropagation_entriesTb4b4b4:
Te6edf3peerTff7b72.Td2a8ffunhandled_messagesTb4b4b4[Te6edf3transient_idTb4b4b4] Tff7b72= Te6edf3routerTff7b72.Td2a8ffpropagation_entriesTb4b4b4[Te6edf3transient_idTb4b4b4]
Tff7b72return Te6edf3peer
Tff7b72def Td2a8ffto_bytesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3dictionary Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffpeering_timebaseTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffpeering_timebase
Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffaliveTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffalive
Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6fflast_heardTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8fflast_heard
Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffdestination_hash
Te6edf3handled_ids Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3transient_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffhandled_messagesTb4b4b4:
Te6edf3handled_idsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3transient_idTb4b4b4)
Te6edf3unhandled_ids Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3transient_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffunhandled_messagesTb4b4b4:
Te6edf3unhandled_idsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3transient_idTb4b4b4)
Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffhandled_idsTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3handled_ids
Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffunhandled_idsTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unhandled_ids
Tff7b72return Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Te6edf3dictionaryTb4b4b4)
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3routerTb4b4b4, Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffalive Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8fflast_heard Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffpeering_timebase Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8fflink Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMPeerTff7b72.Td2a8ffIDLE
Tff7b72selfTff7b72.Td2a8ffunhandled_messages Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ffhandled_messages Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ffrouter Tff7b72= Te6edf3router
Tff7b72selfTff7b72.Td2a8ffdestination_hash Tff7b72= Te6edf3destination_hash
Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdestination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffsyncTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3initiatorTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffunhandled_messagesTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffstate Tff7b72== Te6edf3LXMPeerTff7b72.Td2a8ffIDLETb4b4b4:
Tff7b72selfTff7b72.Td2a8fflink Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestinationTb4b4b4, Te6edf3established_callback Tff7b72= Tff7b72selfTff7b72.Td2a8fflink_establishedTb4b4b4, Te6edf3closed_callback Tff7b72= Tff7b72selfTff7b72.Td2a8fflink_closedTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMPeerTff7b72.Td2a8ffLINK_ESTABLISHING
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffstate Tff7b72== Te6edf3LXMPeerTff7b72.Td2a8ffLINK_READYTb4b4b4:
Te6edf3unhandled_ids Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3transient_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffunhandled_messagesTb4b4b4:
Te6edf3unhandled_idsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3transient_idTb4b4b4)
T8b949e# TODO: Remove
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSending sync request to peerTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffrequestTb4b4b4(Te6edf3LXMPeerTff7b72.Td2a8ffOFFER_REQUEST_PATHTb4b4b4, Te6edf3unhandled_idsTb4b4b4, Te6edf3response_callbackTff7b72=Tff7b72selfTff7b72.Td2a8ffoffer_responseTb4b4b4, Te6edf3failed_callbackTff7b72=Tff7b72selfTff7b72.Td2a8ffrequest_failedTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMPeerTff7b72.Td2a8ffREQUEST_SENT
Tff7b72elseTb4b4b4:
T8b949e# TODO: Remove
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffNo unsynced messagesTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffrequest_failedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3request_receiptTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSync request to peer Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestinationTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff failedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8fflink Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMPeerTff7b72.Td2a8ffIDLE
Tff7b72def Td2a8ffoffer_responseTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3request_receiptTb4b4b4)Tb4b4b4:
T8b949e# TODO: Remove
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffGot offer response from peerTa5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMPeerTff7b72.Td2a8ffRESPONSE_RECEIVED
Te6edf3response Tff7b72= Te6edf3request_receiptTff7b72.Td2a8ffresponse
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Te6edf3responseTb4b4b4)Tb4b4b4)
Te6edf3wanted_messages Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3wanted_message_ids Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Te6edf3response Tff7b72== Te6edf3LXMPeerTff7b72.Td2a8ffERROR_NO_IDENTITYTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fflink Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffRemote peer indicated that no identification was received, retrying...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffindentifyTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMPeerTff7b72.Td2a8ffLINK_READY
Tff7b72selfTff7b72.Td2a8ffsyncTb4b4b4(Tb4b4b4)
Tff7b72elif Te6edf3response Tff7b72== Tff7b72FalseTb4b4b4:
T8b949e# Peer already has all advertised messages
T8b949e# TODO: Remove
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPeer had all advertised messagesTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72for Te6edf3transient_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffunhandled_messagesTb4b4b4:
Te6edf3message_entry Tff7b72= Tff7b72selfTff7b72.Td2a8ffunhandled_messagesTb4b4b4[Te6edf3transient_idTb4b4b4]
Tff7b72selfTff7b72.Td2a8ffhandled_messagesTb4b4b4[Te6edf3transient_idTb4b4b4] Tff7b72= Te6edf3message_entry
Tff7b72selfTff7b72.Td2a8ffunhandled_messages Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72elif Te6edf3response Tff7b72== Tff7b72TrueTb4b4b4:
T8b949e# Peer wants all advertised messages
Tff7b72for Te6edf3transient_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffunhandled_messagesTb4b4b4:
Te6edf3wanted_messagesTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffunhandled_messagesTb4b4b4[Te6edf3transient_idTb4b4b4]Tb4b4b4)
Te6edf3wanted_message_idsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3transient_idTb4b4b4)
Tff7b72elseTb4b4b4:
T8b949e# Peer wants some advertised messages
Tff7b72for Te6edf3transient_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffunhandled_messagesTb4b4b4:
T8b949e# If the peer did not want the message, it has
T8b949e# already received it from another peer.
Tff7b72if Tff7b72not Te6edf3transient_id Tff7b72in Te6edf3responseTb4b4b4:
Te6edf3message_entry Tff7b72= Tff7b72selfTff7b72.Td2a8ffunhandled_messagesTff7b72.Td2a8ffpopTb4b4b4(Te6edf3transient_idTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffhandled_messagesTb4b4b4[Te6edf3transient_idTb4b4b4] Tff7b72= Te6edf3message_entry
Tff7b72for Te6edf3transient_id Tff7b72in Te6edf3responseTb4b4b4:
Te6edf3wanted_messagesTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffunhandled_messagesTb4b4b4[Te6edf3transient_idTb4b4b4]Tb4b4b4)
Te6edf3wanted_message_idsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3transient_idTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3wanted_messagesTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
T8b949e# TODO: Remove
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPeer wanted: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3wanted_messagesTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3lxm_list Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3message_entry Tff7b72in Te6edf3wanted_messagesTb4b4b4:
Te6edf3file_path Tff7b72= Te6edf3message_entryTb4b4b4[T79c0ff1Tb4b4b4]
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3file_pathTb4b4b4)Tb4b4b4:
T8b949e# TODO: Remove
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffLoading Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3file_pathTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff for transferTa5d6ff"Tb4b4b4)
Te6edf3file Tff7b72= Tffa657openTb4b4b4(Te6edf3file_pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4)
Te6edf3lxmf_data Tff7b72= Te6edf3fileTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Te6edf3fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Te6edf3lxm_listTff7b72.Td2a8ffappendTb4b4b4(Te6edf3lxmf_dataTb4b4b4)
Tff7b72elseTb4b4b4:
T8b949e# TODO: Remove
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe requested message Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3file_pathTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff does not existTa5d6ff"Tb4b4b4)
Te6edf3data Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4[Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3lxm_listTb4b4b4]Tb4b4b4)
Te6edf3resource Tff7b72= Te6edf3RNSTff7b72.Td2a8ffResourceTb4b4b4(Te6edf3dataTb4b4b4, Tff7b72selfTff7b72.Td2a8fflinkTb4b4b4, Te6edf3callback Tff7b72= Tff7b72selfTff7b72.Td2a8ffresource_concludedTb4b4b4)
Te6edf3resourceTff7b72.Td2a8fftransferred_messages Tff7b72= Te6edf3wanted_message_ids
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMPeerTff7b72.Td2a8ffRESOURCE_TRANSFERRING
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMPeerTff7b72.Td2a8ffIDLE
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while handling offer response from peer Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestinationTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72def Td2a8ffresource_concludedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3resourceTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3resourceTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Tff7b72for Te6edf3transient_id Tff7b72in Te6edf3resourceTff7b72.Td2a8fftransferred_messagesTb4b4b4:
Te6edf3message Tff7b72= Tff7b72selfTff7b72.Td2a8ffunhandled_messagesTff7b72.Td2a8ffpopTb4b4b4(Te6edf3transient_idTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffhandled_messagesTb4b4b4[Te6edf3transient_idTb4b4b4] Tff7b72= Te6edf3message
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMPeerTff7b72.Td2a8ffIDLE
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffResource transfer for LXMF peer sync failed to Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestinationTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8fflink Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMPeerTff7b72.Td2a8ffIDLE
Tff7b72def Td2a8fflink_establishedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffidentifyTb4b4b4(Tff7b72selfTff7b72.Td2a8ffrouterTff7b72.Td2a8ffidentityTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMPeerTff7b72.Td2a8ffLINK_READY
Tff7b72selfTff7b72.Td2a8ffsyncTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fflink_closedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fflink Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMPeerTff7b72.Td2a8ffIDLE
Tff7b72def Td2a8ffhandle_messageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3transient_idTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3transient_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffhandled_messages Tff7b72and Tff7b72not Te6edf3transient_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffunhandled_messagesTb4b4b4:
T8b949e# TODO: Remove
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe message Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3transient_idTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff was added to distribution queue for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestination_hashTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffunhandled_messagesTb4b4b4[Te6edf3transient_idTb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffrouterTff7b72.Td2a8ffpropagation_entriesTb4b4b4[Te6edf3transient_idTb4b4b4]
Tff7b72elseTb4b4b4:
T8b949e# TODO: Remove
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe message Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3transient_idTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff was NOT added to distribution queue for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestination_hashTb4b4b4)Tb4b4b4)
Tff7b72class T56d364LXMRouterTb4b4b4:
Te6edf3MAX_DELIVERY_ATTEMPTS Tff7b72= T79c0ff3
Te6edf3PROCESSING_INTERVAL Tff7b72= T79c0ff5
Te6edf3DELIVERY_RETRY_WAIT Tff7b72= T79c0ff15
Te6edf3PATH_REQUEST_WAIT Tff7b72= T79c0ff5
Te6edf3LINK_MAX_INACTIVITY Tff7b72= T79c0ff10Tff7b72*T79c0ff60
Te6edf3AUTOPEER Tff7b72= Tff7b72True
Te6edf3AUTOPEER_MAXDEPTH Tff7b72= T79c0ff4
Te6edf3PR_PATH_TIMEOUT Tff7b72= T79c0ff10
Te6edf3PR_IDLE Tff7b72= T79c0ff0x00
Te6edf3PR_PATH_REQUESTED Tff7b72= T79c0ff0x01
Te6edf3PR_LINK_ESTABLISHING Tff7b72= T79c0ff0x02
Te6edf3PR_LINK_ESTABLISHED Tff7b72= T79c0ff0x03
Te6edf3PR_REQUEST_SENT Tff7b72= T79c0ff0x04
Te6edf3PR_RESPONSE_RECEIVED Tff7b72= T79c0ff0x05
Te6edf3PR_COMPLETE Tff7b72= T79c0ff0x06
Te6edf3PR_ALL_MESSAGES Tff7b72= T79c0ff0x00
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3identity Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3autopeer Tff7b72= Te6edf3AUTOPEERTb4b4b4, Te6edf3autopeer_maxdepth Tff7b72= Te6edf3AUTOPEER_MAXDEPTHTb4b4b4)Tb4b4b4:
Te6edf3randomTff7b72.Td2a8ffseedTb4b4b4(Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(T79c0ff10Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpending_inbound Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffpending_outbound Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8fffailed_outbound Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffdirect_links Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ffdelivery_destinations Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ffprocessing_outbound Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffprocessing_inbound Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffprocessing_count Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffpropagation_node Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_node Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_link Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffwants_download_on_path_available_from Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffwants_download_on_path_available_to Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffpropagation_transfer_state Tff7b72= Te6edf3LXMRouterTff7b72.Td2a8ffPR_IDLE
Tff7b72selfTff7b72.Td2a8ffpropagation_transfer_progress Tff7b72= T79c0ff0.0
Tff7b72selfTff7b72.Td2a8ffpropagation_transfer_last_result Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fflocally_delivered_transient_ids Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72if Te6edf3identity Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72= Te6edf3identity
Tff7b72selfTff7b72.Td2a8fflxmf_query_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Tff7b72NoneTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffINTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffPLAINTb4b4b4, Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6ffqueryTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpropagation_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffINTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffautopeer Tff7b72= Te6edf3autopeer
Tff7b72selfTff7b72.Td2a8ffautopeer_maxdepth Tff7b72= Te6edf3autopeer_maxdepth
Tff7b72selfTff7b72.Td2a8ffpeers Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ffpropagation_entries Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ffpropagated_ids Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffregister_announce_handlerTb4b4b4(Te6edf3LXMFDeliveryAnnounceHandlerTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffregister_announce_handlerTb4b4b4(Te6edf3LXMFPropagationAnnounceHandlerTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff__delivery_callback Tff7b72= Tff7b72None
Te6edf3atexitTff7b72.Td2a8ffregisterTb4b4b4(Tff7b72selfTff7b72.Td2a8ffexit_handlerTb4b4b4)
Te6edf3job_thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ffjobloopTb4b4b4)
Te6edf3job_threadTff7b72.Td2a8ffsetDaemonTb4b4b4(Tff7b72TrueTb4b4b4)
Te6edf3job_threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffexit_handlerTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffpropagation_nodeTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3serialised_peers Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3peer_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffpeersTb4b4b4:
Te6edf3peer Tff7b72= Tff7b72selfTff7b72.Td2a8ffpeersTb4b4b4[Te6edf3peer_idTb4b4b4]
Te6edf3serialised_peersTff7b72.Td2a8ffappendTb4b4b4(Te6edf3peerTff7b72.Td2a8ffto_bytesTb4b4b4(Tb4b4b4)Tb4b4b4)
T8b949e# TODO: Remove
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSaving peer Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3peerTb4b4b4)Tb4b4b4)
Te6edf3peers_file Tff7b72= Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstoragepathTff7b72+Ta5d6ff"Ta5d6ff/peersTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4)
Te6edf3peers_fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Te6edf3serialised_peersTb4b4b4)Tb4b4b4)
Te6edf3peers_fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
T8b949e# TODO: Remove
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSaved peersTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not save propagation node peers to storage. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72def Td2a8ffregister_delivery_identityTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3identityTb4b4b4, Te6edf3display_name Tff7b72= Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3delivery_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffINTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Ta5d6ff"Ta5d6fflxmfTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdeliveryTa5d6ff"Tb4b4b4)
Te6edf3delivery_destinationTff7b72.Td2a8ffset_packet_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdelivery_packetTb4b4b4)
Te6edf3delivery_destinationTff7b72.Td2a8ffset_link_established_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdelivery_link_establishedTb4b4b4)
Te6edf3delivery_destinationTff7b72.Td2a8ffdisplay_name Tff7b72= Te6edf3display_name
Tff7b72if Te6edf3display_name Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3delivery_destinationTff7b72.Td2a8ffset_default_app_dataTb4b4b4(Te6edf3display_nameTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdelivery_destinationsTb4b4b4[Te6edf3delivery_destinationTff7b72.Td2a8ffhashTb4b4b4] Tff7b72= Te6edf3delivery_destination
Tff7b72return Te6edf3delivery_destination
Tff7b72def Td2a8ffregister_delivery_callbackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3callbackTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__delivery_callback Tff7b72= Te6edf3callback
Tff7b72def Td2a8ffset_outbound_propagation_nodeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3destination_hashTb4b4b4) Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8 Tff7b72or Tffa657typeTb4b4b4(Te6edf3destination_hashTb4b4b4) Tff7b72!= Tffa657bytesTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid destination hash for outbound propagation nodeTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_node Tff7b72= Te6edf3destination_hash
Tff7b72if Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_link Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_linkTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffhash Tff7b72!= Te6edf3destination_hashTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_link Tff7b72= Tff7b72None
Tff7b72def Td2a8ffget_outbound_propagation_nodeTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_node
Tff7b72def Td2a8ffcancel_propagation_node_requestsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_link Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_link Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffacknowledge_sync_completionTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffacknowledge_sync_completionTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpropagation_transfer_state Tff7b72= Te6edf3LXMRouterTff7b72.Td2a8ffPR_IDLE
Tff7b72selfTff7b72.Td2a8ffpropagation_transfer_progress Tff7b72= T79c0ff0.0
Tff7b72selfTff7b72.Td2a8ffpropagation_transfer_last_result Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffwants_download_on_path_available_from Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffwants_download_on_path_available_to Tff7b72= Tff7b72None
Tff7b72def Td2a8ffrequest_messages_from_propagation_nodeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3identityTb4b4b4, Te6edf3max_messages Tff7b72= Te6edf3PR_ALL_MESSAGESTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpropagation_transfer_progress Tff7b72= T79c0ff0.0
Tff7b72if Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_link Tff7b72!= Tff7b72None Tff7b72and Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_linkTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpropagation_transfer_state Tff7b72= Te6edf3LXMRouterTff7b72.Td2a8ffPR_LINK_ESTABLISHED
Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_linkTff7b72.Td2a8ffidentifyTb4b4b4(Te6edf3identityTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_linkTff7b72.Td2a8ffrequestTb4b4b4(
Te6edf3LXMPeerTff7b72.Td2a8ffMESSAGE_GET_PATHTb4b4b4,
Tb4b4b4[Tff7b72NoneTb4b4b4, Tff7b72NoneTb4b4b4]Tb4b4b4,
Te6edf3response_callbackTff7b72=Tff7b72selfTff7b72.Td2a8ffmessage_list_responseTb4b4b4,
Te6edf3failed_callbackTff7b72=Tff7b72selfTff7b72.Td2a8ffmessage_get_failed
Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_link Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_nodeTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwants_download_on_path_available_from Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffpropagation_transfer_state Tff7b72= Te6edf3LXMRouterTff7b72.Td2a8ffPR_LINK_ESTABLISHING
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffEstablishing link to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_nodeTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff for message downloadTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3propagation_node_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_nodeTb4b4b4)
Te6edf3propagation_node_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3propagation_node_identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffmsg_request_established_callbackTb4b4b4(Te6edf3linkTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrequest_messages_from_propagation_nodeTb4b4b4(Te6edf3identityTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_link Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Te6edf3propagation_node_destinationTb4b4b4, Te6edf3established_callbackTff7b72=Te6edf3msg_request_established_callbackTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffNo path known for message download from propagation node Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_nodeTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. Requesting path...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_nodeTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffwants_download_on_path_available_from Tff7b72= Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_node
Tff7b72selfTff7b72.Td2a8ffwants_download_on_path_available_to Tff7b72= Te6edf3identity
Tff7b72selfTff7b72.Td2a8ffwants_download_on_path_available_timeout Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3LXMRouterTff7b72.Td2a8ffPR_PATH_TIMEOUT
Tff7b72selfTff7b72.Td2a8ffpropagation_transfer_state Tff7b72= Te6edf3LXMRouterTff7b72.Td2a8ffPR_PATH_REQUESTED
Tff7b72selfTff7b72.Td2a8ffrequest_messages_path_jobTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
T8b949e# TODO: Remove
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffWaiting for propagation node link to become activeTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72def Td2a8ffrequest_messages_path_jobTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3job_thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ff__request_messages_path_jobTb4b4b4)
Te6edf3job_threadTff7b72.Td2a8ffsetDaemonTb4b4b4(Tff7b72TrueTb4b4b4)
Te6edf3job_threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff__request_messages_path_jobTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72while Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Tff7b72selfTff7b72.Td2a8ffwants_download_on_path_available_fromTb4b4b4) Tff7b72and Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72< Tff7b72selfTff7b72.Td2a8ffwants_download_on_path_available_timeoutTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Tff7b72selfTff7b72.Td2a8ffwants_download_on_path_available_fromTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrequest_messages_from_propagation_nodeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffwants_download_on_path_available_toTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPropagation node path request timed outTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffacknowledge_sync_completionTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffhas_messageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3transient_idTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3transient_id Tff7b72in Tff7b72selfTff7b72.Td2a8fflocally_delivered_transient_idsTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72def Td2a8ffmessage_get_failedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3request_receiptTb4b4b4)Tb4b4b4:
T8b949e# TODO: Remove or change
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffMessage list/get request failedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_link Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffmessage_list_responseTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3request_receiptTb4b4b4)Tb4b4b4:
T8b949e# TODO: Remove
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffGot message list response from propagation nodeTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3request_receiptTff7b72.Td2a8ffresponse Tff7b72== Te6edf3LXMPeerTff7b72.Td2a8ffERROR_NO_IDENTITYTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPropagation node indicated missing identification on reuquestTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_link Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
T8b949e# TODO: Remove
Tff7b72if Te6edf3request_receiptTff7b72.Td2a8ffresponse Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReceived message list from node:Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3haves Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3wants Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Tffa657lenTb4b4b4(Te6edf3request_receiptTff7b72.Td2a8ffresponseTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72for Te6edf3transient_id Tff7b72in Te6edf3request_receiptTff7b72.Td2a8ffresponseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ff Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3transient_idTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffhas_messageTb4b4b4(Te6edf3transient_idTb4b4b4)Tb4b4b4:
Te6edf3havesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3transient_idTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3wantsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3transient_idTb4b4b4)
Te6edf3request_receiptTff7b72.Td2a8fflinkTff7b72.Td2a8ffrequestTb4b4b4(
Te6edf3LXMPeerTff7b72.Td2a8ffMESSAGE_GET_PATHTb4b4b4,
Tb4b4b4[Te6edf3wantsTb4b4b4, Te6edf3havesTb4b4b4]Tb4b4b4,
Te6edf3response_callbackTff7b72=Tff7b72selfTff7b72.Td2a8ffmessage_get_responseTb4b4b4,
Te6edf3failed_callbackTff7b72=Tff7b72selfTff7b72.Td2a8ffmessage_get_failedTb4b4b4,
Te6edf3progress_callbackTff7b72=Tff7b72selfTff7b72.Td2a8ffmessage_get_progress
Tb4b4b4)
Tff7b72elseTb4b4b4:
T8b949e# TODO: Remove
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffNo messages on nodeTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpropagation_transfer_state Tff7b72= Te6edf3LXMRouterTff7b72.Td2a8ffPR_COMPLETE
Tff7b72selfTff7b72.Td2a8ffpropagation_transfer_progress Tff7b72= T79c0ff1.0
Tff7b72selfTff7b72.Td2a8ffpropagation_transfer_last_result Tff7b72= T79c0ff0
Tff7b72def Td2a8ffmessage_get_progressTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3request_receiptTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpropagation_transfer_progress Tff7b72= Te6edf3request_receiptTff7b72.Td2a8ffget_progressTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffProgress: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpropagation_transfer_progressTb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffmessage_get_responseTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3request_receiptTb4b4b4)Tb4b4b4:
T8b949e# TODO: Remove
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffGot message download response from propagation nodeTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3request_receiptTff7b72.Td2a8ffresponse Tff7b72== Te6edf3LXMPeerTff7b72.Td2a8ffERROR_NO_IDENTITYTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPropagation node indicated missing identification on reuquestTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_link Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3request_receiptTff7b72.Td2a8ffresponse Tff7b72!= Tff7b72None Tff7b72and Tffa657lenTb4b4b4(Te6edf3request_receiptTff7b72.Td2a8ffresponseTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3haves Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3lxmf_data Tff7b72in Te6edf3request_receiptTff7b72.Td2a8ffresponseTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflxmf_propagationTb4b4b4(Te6edf3lxmf_dataTb4b4b4)
Te6edf3havesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3lxmf_dataTb4b4b4)Tb4b4b4)
T8b949e# Return a list of successfully received messages to the node
T8b949e# TODO: Remove
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffTelling node to clear Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657lenTb4b4b4(Te6edf3havesTb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff messagesTa5d6ff"Tb4b4b4)
Te6edf3request_receiptTff7b72.Td2a8fflinkTff7b72.Td2a8ffrequestTb4b4b4(
Te6edf3LXMPeerTff7b72.Td2a8ffMESSAGE_GET_PATHTb4b4b4,
Tb4b4b4[Tff7b72NoneTb4b4b4, Te6edf3havesTb4b4b4]Tb4b4b4,
T8b949e# response_callback=self.message_syncfinal_response,
Te6edf3failed_callbackTff7b72=Tff7b72selfTff7b72.Td2a8ffmessage_get_failedTb4b4b4,
T8b949e# progress_callback=self.message_get_progress
Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffNo LXMF data received in message download responseTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
T8b949e# TODO: Remove
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffNo messages on nodeTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpropagation_transfer_state Tff7b72= Te6edf3LXMRouterTff7b72.Td2a8ffPR_COMPLETE
Tff7b72selfTff7b72.Td2a8ffpropagation_transfer_progress Tff7b72= T79c0ff1.0
Tff7b72selfTff7b72.Td2a8ffpropagation_transfer_last_result Tff7b72= Tffa657lenTb4b4b4(Te6edf3request_receiptTff7b72.Td2a8ffresponseTb4b4b4)
Tff7b72def Td2a8ffannounceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3destination_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffdelivery_destinationsTb4b4b4:
Te6edf3delivery_destination Tff7b72= Tff7b72selfTff7b72.Td2a8ffdelivery_destinationsTb4b4b4[Te6edf3destination_hashTb4b4b4]
Te6edf3delivery_destinationTff7b72.Td2a8ffannounceTb4b4b4(Te6edf3delivery_destinationTff7b72.Td2a8ffdisplay_nameTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffhandle_outboundTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3lxmessageTb4b4b4)Tb4b4b4:
Te6edf3lxmessageTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffOUTBOUND
Tff7b72if Tff7b72not Te6edf3lxmessageTff7b72.Td2a8ffpackedTb4b4b4:
Te6edf3lxmessageTff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)
Te6edf3lxmessageTff7b72.Td2a8ffdetermine_transport_encryptionTb4b4b4(Tb4b4b4)
Tff7b72while Tff7b72selfTff7b72.Td2a8ffprocessing_outboundTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpending_outboundTff7b72.Td2a8ffappendTb4b4b4(Te6edf3lxmessageTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffprocess_outboundTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fflxmf_deliveryTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3lxmf_dataTb4b4b4, Te6edf3destination_type Tff7b72= Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3message Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffunpack_from_bytesTb4b4b4(Te6edf3lxmf_dataTb4b4b4)
Tff7b72if Te6edf3destination_type Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4:
Te6edf3messageTff7b72.Td2a8fftransport_encrypted Tff7b72= Tff7b72True
Te6edf3messageTff7b72.Td2a8fftransport_encryption Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffENCRYPTION_DESCRIPTION_EC
Tff7b72elif Te6edf3destination_type Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffGROUPTb4b4b4:
Te6edf3messageTff7b72.Td2a8fftransport_encrypted Tff7b72= Tff7b72True
Te6edf3messageTff7b72.Td2a8fftransport_encryption Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffENCRYPTION_DESCRIPTION_AES
Tff7b72elif Te6edf3destination_type Tff7b72== Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffLINKTb4b4b4:
Te6edf3messageTff7b72.Td2a8fftransport_encrypted Tff7b72= Tff7b72True
Te6edf3messageTff7b72.Td2a8fftransport_encryption Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffENCRYPTION_DESCRIPTION_EC
Tff7b72elseTb4b4b4:
Te6edf3messageTff7b72.Td2a8fftransport_encrypted Tff7b72= Tff7b72False
Te6edf3messageTff7b72.Td2a8fftransport_encryption Tff7b72= Tff7b72None
Tff7b72if Tff7b72selfTff7b72.Td2a8ff__delivery_callback Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__delivery_callbackTb4b4b4(Te6edf3messageTb4b4b4)
Tff7b72return Tff7b72True
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not assemble LXMF message from received dataTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_NOTICETb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72return Tff7b72False
Tff7b72def Td2a8ffdelivery_packetTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3packetTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffdestination_type Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffLINKTb4b4b4:
Te6edf3lxmf_data Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Te6edf3lxmf_data Tff7b72+Tff7b72= Te6edf3packetTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffhash
Te6edf3lxmf_data Tff7b72+Tff7b72= Te6edf3data
Tff7b72elseTb4b4b4:
Te6edf3lxmf_data Tff7b72= Te6edf3data
Tff7b72if Tff7b72selfTff7b72.Td2a8fflxmf_deliveryTb4b4b4(Te6edf3lxmf_dataTb4b4b4, Te6edf3packetTff7b72.Td2a8ffdestination_typeTb4b4b4)Tb4b4b4:
Te6edf3packetTff7b72.Td2a8ffproveTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffException occurred while parsing incoming LXMF data.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72def Td2a8ffdelivery_link_establishedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4)Tb4b4b4:
Te6edf3linkTff7b72.Td2a8ffset_packet_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdelivery_packetTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_resource_strategyTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACCEPT_ALLTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_resource_started_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ffresource_transfer_beganTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_resource_concluded_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdelivery_resource_concludedTb4b4b4)
Tff7b72def Td2a8ffdelivery_link_closedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4)Tb4b4b4:
Tff7b72pass
Tff7b72def Td2a8ffresource_transfer_beganTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3resourceTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffTransfer began for resource Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3resourceTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72def Td2a8ffdelivery_resource_concludedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3resourceTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffTransfer concluded for delivery resource Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3resourceTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Te6edf3resourceTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Tff7b72selfTff7b72.Td2a8fflxmf_deliveryTb4b4b4(Te6edf3resourceTff7b72.Td2a8ffdataTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3resourceTff7b72.Td2a8fflinkTff7b72.Td2a8fftypeTb4b4b4)
Tff7b72def Td2a8ffenable_propagationTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3storagepathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstoragepath Tff7b72= Te6edf3storagepathTff7b72+Ta5d6ff"Ta5d6ff/lxmfTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffmessagepath Tff7b72= Tff7b72selfTff7b72.Td2a8ffstoragepathTff7b72+Ta5d6ff"Ta5d6ff/messagestoreTa5d6ff"
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstoragepathTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstoragepathTb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmessagepathTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmessagepathTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpropagation_entries Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72for Te6edf3filename Tff7b72in Te6edf3osTff7b72.Td2a8fflistdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmessagepathTb4b4b4)Tb4b4b4:
Te6edf3components Tff7b72= Te6edf3filenameTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff_Ta5d6ff"Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3componentsTb4b4b4) Tff7b72== T79c0ff2Tb4b4b4:
Tff7b72if Tffa657floatTb4b4b4(Te6edf3componentsTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3componentsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffHASHLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72*T79c0ff2Tb4b4b4:
Te6edf3transient_id Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3componentsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)
Te6edf3received Tff7b72= Te6edf3componentsTb4b4b4[T79c0ff1Tb4b4b4]
Te6edf3filepath Tff7b72= Tff7b72selfTff7b72.Td2a8ffmessagepathTff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Te6edf3filename
Te6edf3file Tff7b72= Tffa657openTb4b4b4(Te6edf3filepathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4)
Te6edf3destination_hash Tff7b72= Te6edf3fileTff7b72.Td2a8ffreadTb4b4b4(Te6edf3LXMessageTff7b72.Td2a8ffDESTINATION_LENGTHTb4b4b4)
Te6edf3fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpropagation_entriesTb4b4b4[Te6edf3transient_idTb4b4b4] Tff7b72= Tb4b4b4[Te6edf3destination_hashTb4b4b4, Te6edf3filepathTb4b4b4]
T8b949e# TODO: Remove
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffRegistered msg Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3transient_idTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff at Ta5d6ff"Tff7b72+Te6edf3filepathTff7b72+Ta5d6ff"Ta5d6ff for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstoragepathTff7b72+Ta5d6ff"Ta5d6ff/peersTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3peers_file Tff7b72= Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstoragepathTff7b72+Ta5d6ff"Ta5d6ff/peersTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4)
Te6edf3serialised_peers Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3peers_fileTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72for Te6edf3serialised_peer Tff7b72in Te6edf3serialised_peersTb4b4b4:
Te6edf3peer Tff7b72= Te6edf3LXMPeerTff7b72.Td2a8fffrom_bytesTb4b4b4(Te6edf3serialised_peerTb4b4b4, Tff7b72selfTb4b4b4)
Tff7b72if Te6edf3peerTff7b72.Td2a8ffidentity Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpeersTb4b4b4[Te6edf3peerTff7b72.Td2a8ffdestination_hashTb4b4b4] Tff7b72= Te6edf3peer
T8b949e# TODO: Remove
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffLoaded peer Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3peerTff7b72.Td2a8ffdestination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff with Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657lenTb4b4b4(Te6edf3peerTff7b72.Td2a8ffunhandled_messagesTb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff unhandled messagesTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPeer Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3peerTff7b72.Td2a8ffdestination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff could not be loaded, because its identity could not be recalled. Dropping peer.Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpropagation_node Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffpropagation_destinationTff7b72.Td2a8ffset_link_established_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpropagation_link_establishedTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpropagation_destinationTff7b72.Td2a8ffset_packet_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpropagation_packetTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpropagation_destinationTff7b72.Td2a8ffregister_request_handlerTb4b4b4(Te6edf3LXMPeerTff7b72.Td2a8ffOFFER_REQUEST_PATHTb4b4b4, Tff7b72selfTff7b72.Td2a8ffoffer_requestTb4b4b4, Te6edf3allow Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffALLOW_ALLTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpropagation_destinationTff7b72.Td2a8ffregister_request_handlerTb4b4b4(Te6edf3LXMPeerTff7b72.Td2a8ffMESSAGE_GET_PATHTb4b4b4, Tff7b72selfTff7b72.Td2a8ffmessage_get_requestTb4b4b4, Te6edf3allow Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffALLOW_ALLTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffannounce_propagation_nodeTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not enable propagation node. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffdisable_propagationTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpropagation_node Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffannounce_propagation_nodeTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffannounce_propagation_nodeTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3data Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4[Tff7b72selfTff7b72.Td2a8ffpropagation_nodeTb4b4b4, Tffa657intTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpropagation_destinationTff7b72.Td2a8ffannounceTb4b4b4(Te6edf3app_dataTff7b72=Te6edf3dataTb4b4b4)
Tff7b72def Td2a8ffoffer_requestTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pathTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3request_idTb4b4b4, Te6edf3remote_identityTb4b4b4, Te6edf3requested_atTb4b4b4)Tb4b4b4:
T8b949e# TODO: Remove
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffOffer requestTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3remote_identity Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3LXMPeerTff7b72.Td2a8ffERROR_NO_IDENTITY
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4:
T8b949e# TODO: Remove
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4)
Te6edf3transient_ids Tff7b72= Te6edf3data
Te6edf3wanted_ids Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3transient_id Tff7b72in Te6edf3transient_idsTb4b4b4:
Tff7b72if Tff7b72not Te6edf3transient_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffpropagation_entriesTb4b4b4:
Te6edf3wanted_idsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3transient_idTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3wanted_idsTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72return Tff7b72False
Tff7b72elif Tffa657lenTb4b4b4(Te6edf3wanted_idsTb4b4b4) Tff7b72== Tffa657lenTb4b4b4(Te6edf3transient_idsTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3wanted_ids
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError occurred while generating response for sync request, the contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72return Tff7b72None
Tff7b72def Td2a8ffmessage_get_requestTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pathTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3request_idTb4b4b4, Te6edf3remote_identityTb4b4b4, Te6edf3requested_atTb4b4b4)Tb4b4b4:
T8b949e# TODO: Remove
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffMessage get requestTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3remote_identity Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3LXMPeerTff7b72.Td2a8ffERROR_NO_IDENTITY
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3remote_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3remote_identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6ffdeliveryTa5d6ff"Tb4b4b4)
T8b949e# If both want and have fields are empty, send a list of
T8b949e# available messages.
Tff7b72if Te6edf3dataTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Tff7b72None Tff7b72and Te6edf3dataTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3available_messages Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3transient_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffpropagation_entriesTb4b4b4:
Te6edf3message_entry Tff7b72= Tff7b72selfTff7b72.Td2a8ffpropagation_entriesTb4b4b4[Te6edf3transient_idTb4b4b4]
Tff7b72if Te6edf3message_entryTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Te6edf3remote_destinationTff7b72.Td2a8ffhashTb4b4b4:
Te6edf3message_size Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffgetsizeTb4b4b4(Te6edf3message_entryTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)
Te6edf3available_entry Tff7b72= Tb4b4b4[Te6edf3transient_idTb4b4b4, Te6edf3message_sizeTb4b4b4]
Te6edf3available_messagesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3available_entryTb4b4b4)
Te6edf3available_messagesTff7b72.Td2a8ffsortTb4b4b4(Te6edf3keyTff7b72=Tff7b72lambda Te6edf3eTb4b4b4: Te6edf3eTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Te6edf3reverseTff7b72=Tff7b72FalseTb4b4b4)
T8b949e# TODO: Remove
Tff7b72for Te6edf3am Tff7b72in Te6edf3available_messagesTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffMsg size: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3amTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)Tb4b4b4)
T8b949e##############
Te6edf3transient_ids Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3available_entry Tff7b72in Te6edf3available_messagesTb4b4b4:
Te6edf3transient_idsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3available_entryTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)
Tff7b72return Te6edf3transient_ids
Tff7b72elseTb4b4b4:
T8b949e# Process messages the client already have
Tff7b72if Te6edf3dataTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72!= Tff7b72None Tff7b72and Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72for Te6edf3transient_id Tff7b72in Te6edf3dataTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3transient_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffpropagation_entries Tff7b72and Tff7b72selfTff7b72.Td2a8ffpropagation_entriesTb4b4b4[Te6edf3transient_idTb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Te6edf3remote_destinationTff7b72.Td2a8ffhashTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3filepath Tff7b72= Tff7b72selfTff7b72.Td2a8ffpropagation_entriesTb4b4b4[Te6edf3transient_idTb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffpropagation_entriesTff7b72.Td2a8ffpopTb4b4b4(Te6edf3transient_idTb4b4b4)
Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Te6edf3filepathTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffClient Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3remote_destinationTff7b72.Td2a8ffhashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff purged message Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3transient_idTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff at Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3filepathTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while processing message purge request from Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3remote_destinationTff7b72.Td2a8ffhashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
T8b949e# Process wanted messages
Te6edf3response_messages Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Te6edf3dataTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72!= Tff7b72None Tff7b72and Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72for Te6edf3transient_id Tff7b72in Te6edf3dataTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3transient_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffpropagation_entries Tff7b72and Tff7b72selfTff7b72.Td2a8ffpropagation_entriesTb4b4b4[Te6edf3transient_idTb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Te6edf3remote_destinationTff7b72.Td2a8ffhashTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3filepath Tff7b72= Tff7b72selfTff7b72.Td2a8ffpropagation_entriesTb4b4b4[Te6edf3transient_idTb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffClient Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3remote_destinationTff7b72.Td2a8ffhashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff requested message Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3transient_idTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff at Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3filepathTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3message_file Tff7b72= Tffa657openTb4b4b4(Te6edf3filepathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4)
Te6edf3lxmf_data Tff7b72= Te6edf3message_fileTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Te6edf3response_messagesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3lxmf_dataTb4b4b4)
Te6edf3message_fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while processing message download request from Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3remote_destinationTff7b72.Td2a8ffhashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Te6edf3response_messages
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError occurred while generating response for download request, the contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72return Tff7b72None
Tff7b72def Td2a8ffpropagation_link_establishedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4)Tb4b4b4:
Te6edf3linkTff7b72.Td2a8ffset_packet_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpropagation_packetTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_resource_strategyTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACCEPT_ALLTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_resource_started_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ffresource_transfer_beganTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_resource_concluded_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpropagation_resource_concludedTb4b4b4)
Tff7b72def Td2a8ffpropagation_packetTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3packetTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffdestination_type Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffLINKTb4b4b4:
Tff7b72pass
Tff7b72elseTb4b4b4:
Te6edf3data Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3dataTb4b4b4)
Te6edf3remote_timebase Tff7b72= Te6edf3dataTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3messages Tff7b72= Te6edf3dataTb4b4b4[T79c0ff1Tb4b4b4]
Tff7b72for Te6edf3lxmf_data Tff7b72in Te6edf3messagesTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflxmf_propagationTb4b4b4(Te6edf3lxmf_dataTb4b4b4)
Te6edf3packetTff7b72.Td2a8ffproveTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffException occurred while parsing incoming LXMF propagation data.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72def Td2a8ffpropagation_resource_concludedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3resourceTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffTransfer concluded for incoming propagation resource Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3resourceTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Te6edf3resourceTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
T8b949e# TODO: The peer this was received from should
T8b949e# have the transient id added to it's list of
T8b949e# already handled messages.
Tff7b72tryTb4b4b4:
Te6edf3data Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3resourceTff7b72.Td2a8ffdataTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72if Tffa657typeTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72== Tffa657list Tff7b72and Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72== T79c0ff2 Tff7b72and Tffa657typeTb4b4b4(Te6edf3dataTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Tffa657floatTb4b4b4) Tff7b72and Tffa657typeTb4b4b4(Te6edf3dataTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4) Tff7b72== Tffa657listTb4b4b4:
T8b949e# This is a series of propagation messages from a peer or originator
Te6edf3remote_timebase Tff7b72= Te6edf3dataTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3remote_hash Tff7b72= Tff7b72None
Te6edf3remote_identity Tff7b72= Te6edf3resourceTff7b72.Td2a8fflinkTff7b72.Td2a8ffget_remote_identityTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3remote_identity Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3remote_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3remote_identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4)
Te6edf3remote_hash Tff7b72= Te6edf3remote_destinationTff7b72.Td2a8ffhash
Tff7b72if Tff7b72not Te6edf3remote_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffpeersTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpeerTb4b4b4(Te6edf3remote_hashTb4b4b4, Te6edf3remote_timebaseTb4b4b4)
Te6edf3messages Tff7b72= Te6edf3dataTb4b4b4[T79c0ff1Tb4b4b4]
Tff7b72for Te6edf3lxmf_data Tff7b72in Te6edf3messagesTb4b4b4:
Tff7b72if Te6edf3remote_hash Tff7b72!= Tff7b72None Tff7b72and Te6edf3remote_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffpeersTb4b4b4:
Te6edf3transient_id Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3lxmf_dataTb4b4b4)
Te6edf3peer Tff7b72= Tff7b72selfTff7b72.Td2a8ffpeersTb4b4b4[Te6edf3remote_hashTb4b4b4]
Te6edf3peerTff7b72.Td2a8ffhandled_messagesTb4b4b4[Te6edf3transient_idTb4b4b4] Tff7b72= Tb4b4b4[Te6edf3transient_idTb4b4b4, Te6edf3remote_timebaseTb4b4b4, Te6edf3lxmf_dataTb4b4b4]
Tff7b72selfTff7b72.Td2a8fflxmf_propagationTb4b4b4(Te6edf3lxmf_dataTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffInvalid data structure received at propagation destination, ignoringTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while unpacking received propagation resourceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72def Td2a8fflxmf_propagationTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3lxmf_dataTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3lxmf_dataTb4b4b4) Tff7b72>Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffLXMF_OVERHEADTb4b4b4:
Te6edf3transient_id Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3lxmf_dataTb4b4b4)
Tff7b72if Tff7b72not Te6edf3transient_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffpropagation_entries Tff7b72and Tff7b72not Te6edf3transient_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffpropagated_idsTb4b4b4:
Te6edf3received Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3propagation_entry Tff7b72= Tb4b4b4[Te6edf3transient_idTb4b4b4, Te6edf3receivedTb4b4b4, Te6edf3lxmf_dataTb4b4b4]
Te6edf3destination_hash Tff7b72= Te6edf3lxmf_dataTb4b4b4[Tb4b4b4:Te6edf3LXMessageTff7b72.Td2a8ffDESTINATION_LENGTHTb4b4b4]
Tff7b72if Te6edf3destination_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffdelivery_destinationsTb4b4b4:
Te6edf3delivery_destination Tff7b72= Tff7b72selfTff7b72.Td2a8ffdelivery_destinationsTb4b4b4[Te6edf3destination_hashTb4b4b4]
Te6edf3encrypted_lxmf_data Tff7b72= Te6edf3lxmf_dataTb4b4b4[Te6edf3LXMessageTff7b72.Td2a8ffDESTINATION_LENGTHTb4b4b4:Tb4b4b4]
Te6edf3decrypted_lxmf_data Tff7b72= Te6edf3delivery_destinationTff7b72.Td2a8ffdecryptTb4b4b4(Te6edf3encrypted_lxmf_dataTb4b4b4)
Te6edf3delivery_data Tff7b72= Te6edf3lxmf_dataTb4b4b4[Tb4b4b4:Te6edf3LXMessageTff7b72.Td2a8ffDESTINATION_LENGTHTb4b4b4]Tff7b72+Te6edf3decrypted_lxmf_data
Tff7b72selfTff7b72.Td2a8fflxmf_deliveryTb4b4b4(Te6edf3delivery_dataTb4b4b4, Te6edf3delivery_destinationTff7b72.Td2a8fftypeTb4b4b4)
Tff7b72selfTff7b72.Td2a8fflocally_delivered_transient_idsTb4b4b4[Te6edf3transient_idTb4b4b4] Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffpropagation_nodeTb4b4b4:
Te6edf3file_path Tff7b72= Tff7b72selfTff7b72.Td2a8ffmessagepathTff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3transient_idTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff_Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3receivedTb4b4b4)
Te6edf3msg_file Tff7b72= Tffa657openTb4b4b4(Te6edf3file_pathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4)
Te6edf3msg_fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3lxmf_dataTb4b4b4)
Te6edf3msg_fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpropagation_entriesTb4b4b4[Te6edf3transient_idTb4b4b4] Tff7b72= Tb4b4b4[Te6edf3destination_hashTb4b4b4, Te6edf3file_pathTb4b4b4]
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReceived propagated LXMF message Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3transient_idTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff, adding to peer distribution queues...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72for Te6edf3peer_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffpeersTb4b4b4:
Te6edf3peer Tff7b72= Tff7b72selfTff7b72.Td2a8ffpeersTb4b4b4[Te6edf3peer_idTb4b4b4]
Te6edf3peerTff7b72.Td2a8ffhandle_messageTb4b4b4(Te6edf3transient_idTb4b4b4)
Tff7b72return Tff7b72True
Tff7b72return Tff7b72False
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not assemble propagated LXMF message from received dataTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72return Tff7b72False
Tff7b72def Td2a8ffpeerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destination_hashTb4b4b4, Te6edf3timestampTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3destination_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffpeersTb4b4b4:
Te6edf3peer Tff7b72= Tff7b72selfTff7b72.Td2a8ffpeersTb4b4b4[Te6edf3destination_hashTb4b4b4]
Te6edf3peerTff7b72.Td2a8ffalive Tff7b72= Tff7b72True
Te6edf3peerTff7b72.Td2a8ffpeering_timebase Tff7b72= Te6edf3timestamp
Te6edf3peerTff7b72.Td2a8fflast_heard Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3peer Tff7b72= Te6edf3LXMPeerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destination_hashTb4b4b4)
Te6edf3peerTff7b72.Td2a8ffalive Tff7b72= Tff7b72True
Te6edf3peerTff7b72.Td2a8fflast_heard Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpeersTb4b4b4[Te6edf3destination_hashTb4b4b4] Tff7b72= Te6edf3peer
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPeered with Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3peerTff7b72.Td2a8ffdestinationTb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffunpeerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destination_hashTb4b4b4, Te6edf3timestamp Tff7b72= Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3timestamp Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3timestamp Tff7b72= Tffa657intTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3destination_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffpeersTb4b4b4:
Te6edf3peer Tff7b72= Tff7b72selfTff7b72.Td2a8ffpeersTb4b4b4[Te6edf3destination_hashTb4b4b4]
Tff7b72if Te6edf3timestamp Tff7b72>Tff7b72= Te6edf3peerTff7b72.Td2a8ffpeering_timebaseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpeersTff7b72.Td2a8ffpopTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpropagation_destinationTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff broke peering with Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3peerTff7b72.Td2a8ffdestinationTb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffjobloopTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72while Tb4b4b4(Tff7b72TrueTb4b4b4)Tb4b4b4:
T8b949e# TODO: Improve this to scheduling, so manual
T8b949e# triggers can delay next run
Tff7b72selfTff7b72.Td2a8ffjobsTb4b4b4(Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3LXMRouterTff7b72.Td2a8ffPROCESSING_INTERVALTb4b4b4)
Te6edf3JOB_OUTBOUND_INTERVAL Tff7b72= T79c0ff1
Te6edf3JOB_LINKS_INTERVAL Tff7b72= T79c0ff1
Te6edf3JOB_PEERSYNC_INTERVAL Tff7b72= T79c0ff12
Tff7b72def Td2a8ffjobsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffprocessing_count Tff7b72% Te6edf3LXMRouterTff7b72.Td2a8ffJOB_OUTBOUND_INTERVAL Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffprocess_outboundTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffprocessing_count Tff7b72% Te6edf3LXMRouterTff7b72.Td2a8ffJOB_LINKS_INTERVAL Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffclean_linksTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffprocessing_count Tff7b72% Te6edf3LXMRouterTff7b72.Td2a8ffJOB_PEERSYNC_INTERVAL Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsync_peersTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffprocessing_count Tff7b72+Tff7b72= T79c0ff1
Tff7b72def Td2a8ffclean_linksTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3closed_links Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3link_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffdirect_linksTb4b4b4:
Te6edf3link Tff7b72= Tff7b72selfTff7b72.Td2a8ffdirect_linksTb4b4b4[Te6edf3link_hashTb4b4b4]
Te6edf3inactive_time Tff7b72= Te6edf3linkTff7b72.Td2a8ffinactive_forTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3inactive_time Tff7b72> Te6edf3LXMRouterTff7b72.Td2a8ffLINK_MAX_INACTIVITYTb4b4b4:
Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3closed_linksTff7b72.Td2a8ffappendTb4b4b4(Te6edf3link_hashTb4b4b4)
Tff7b72for Te6edf3link_hash Tff7b72in Te6edf3closed_linksTb4b4b4:
Te6edf3cleaned_link Tff7b72= Tff7b72selfTff7b72.Td2a8ffdirect_linksTff7b72.Td2a8ffpopTb4b4b4(Te6edf3link_hashTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCleaned link Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3cleaned_linkTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_link Tff7b72!= Tff7b72None Tff7b72and Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_linkTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffCLOSEDTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_link Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffacknowledge_sync_completionTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCleaned outbound propagation linkTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72def Td2a8ffsync_peersTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3waiting_peers Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3peer_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffpeersTb4b4b4:
Te6edf3peer Tff7b72= Tff7b72selfTff7b72.Td2a8ffpeersTb4b4b4[Te6edf3peer_idTb4b4b4]
Tff7b72if Te6edf3peerTff7b72.Td2a8ffstate Tff7b72== Te6edf3LXMPeerTff7b72.Td2a8ffIDLE Tff7b72and Tffa657lenTb4b4b4(Te6edf3peerTff7b72.Td2a8ffunhandled_messagesTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3waiting_peersTff7b72.Td2a8ffappendTb4b4b4(Te6edf3peerTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3waiting_peersTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
T8b949e# TODO: Remove
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffRandomly selecting peer to sync from Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657lenTb4b4b4(Te6edf3waiting_peersTb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff waiting peers.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3selected_index Tff7b72= Te6edf3randomTff7b72.Td2a8ffrandintTb4b4b4(T79c0ff0Tb4b4b4,Tffa657lenTb4b4b4(Te6edf3waiting_peersTb4b4b4)Tff7b72-T79c0ff1Tb4b4b4)
Te6edf3selected_peer Tff7b72= Te6edf3waiting_peersTb4b4b4[Te6edf3selected_indexTb4b4b4]
T8b949e# TODO: Remove
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSelected waiting peer Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3selected_indexTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff: Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3selected_peerTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3selected_peerTff7b72.Td2a8ffsyncTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fffail_messageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3lxmessageTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Te6edf3lxmessageTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff failed to sendTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpending_outboundTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3lxmessageTb4b4b4)
Tff7b72selfTff7b72.Td2a8fffailed_outboundTff7b72.Td2a8ffappendTb4b4b4(Te6edf3lxmessageTb4b4b4)
Te6edf3lxmessageTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMessageTff7b72.Td2a8ffFAILED
Tff7b72if Te6edf3lxmessageTff7b72.Td2a8fffailed_callback Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3lxmessageTff7b72.Td2a8fffailed_callbackTb4b4b4(Te6edf3lxmessageTb4b4b4)
Tff7b72def Td2a8ffprocess_outboundTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sender Tff7b72= Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffprocessing_outboundTb4b4b4:
Tff7b72return
Tff7b72for Te6edf3lxmessage Tff7b72in Tff7b72selfTff7b72.Td2a8ffpending_outboundTb4b4b4:
Tff7b72if Te6edf3lxmessageTff7b72.Td2a8ffstate Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffDELIVEREDTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDelivery has occurred for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3lxmessageTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff, removing from outbound queueTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpending_outboundTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3lxmessageTb4b4b4)
Tff7b72elif Te6edf3lxmessageTff7b72.Td2a8ffstate Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffSENTTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPropagation has occurred for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3lxmessageTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff, removing from outbound queueTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpending_outboundTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3lxmessageTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffStarting outbound processing for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3lxmessageTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3lxmessageTff7b72.Td2a8ffget_destinationTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
T8b949e# Outbound handling for opportunistic messages
Tff7b72if Te6edf3lxmessageTff7b72.Td2a8ffmethod Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffOPPORTUNISTICTb4b4b4:
Tff7b72if Te6edf3lxmessageTff7b72.Td2a8ffdelivery_attempts Tff7b72<Tff7b72= Te6edf3LXMRouterTff7b72.Td2a8ffMAX_DELIVERY_ATTEMPTSTb4b4b4:
Tff7b72if Tff7b72not Tffa657hasattrTb4b4b4(Te6edf3lxmessageTb4b4b4, Ta5d6ff"Ta5d6ffnext_delivery_attemptTa5d6ff"Tb4b4b4) Tff7b72or Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3lxmessageTff7b72.Td2a8ffnext_delivery_attemptTb4b4b4:
Te6edf3lxmessageTff7b72.Td2a8ffdelivery_attempts Tff7b72+Tff7b72= T79c0ff1
Te6edf3lxmessageTff7b72.Td2a8ffnext_delivery_attempt Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3LXMRouterTff7b72.Td2a8ffDELIVERY_RETRY_WAIT
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffOpportunistic delivery attempt Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3lxmessageTff7b72.Td2a8ffdelivery_attemptsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3lxmessageTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3lxmessageTff7b72.Td2a8ffget_destinationTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3lxmessageTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffMax delivery attempts reached for oppertunistic Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3lxmessageTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3lxmessageTff7b72.Td2a8ffget_destinationTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8fffail_messageTb4b4b4(Te6edf3lxmessageTb4b4b4)
T8b949e# Outbound handling for messages transferred
T8b949e# over a direct link to the final recipient
Tff7b72elif Te6edf3lxmessageTff7b72.Td2a8ffmethod Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffDIRECTTb4b4b4:
Tff7b72if Te6edf3lxmessageTff7b72.Td2a8ffdelivery_attempts Tff7b72<Tff7b72= Te6edf3LXMRouterTff7b72.Td2a8ffMAX_DELIVERY_ATTEMPTSTb4b4b4:
Te6edf3delivery_destination_hash Tff7b72= Te6edf3lxmessageTff7b72.Td2a8ffget_destinationTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffhash
Tff7b72if Te6edf3delivery_destination_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffdirect_linksTb4b4b4:
T8b949e# A link already exists, so we'll try to use it
T8b949e# to deliver the message
Te6edf3direct_link Tff7b72= Tff7b72selfTff7b72.Td2a8ffdirect_linksTb4b4b4[Te6edf3delivery_destination_hashTb4b4b4]
Tff7b72if Te6edf3direct_linkTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4:
Tff7b72if Te6edf3lxmessageTff7b72.Td2a8ffstate Tff7b72!= Te6edf3LXMessageTff7b72.Td2a8ffSENDINGTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffStarting transfer of Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3lxmessageTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3lxmessageTff7b72.Td2a8ffget_destinationTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3lxmessageTff7b72.Td2a8ffset_delivery_destinationTb4b4b4(Te6edf3direct_linkTb4b4b4)
Te6edf3lxmessageTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3lxmessageTff7b72.Td2a8ffrepresentation Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffRESOURCETb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe transfer of Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3lxmessageTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff is in progress (Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3lxmessageTff7b72.Td2a8ffprogressTff7b72*T79c0ff100Tb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff%Ta5d6ff)Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffWaiting for proof for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3lxmessageTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff sent as link packetTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72elif Te6edf3direct_linkTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffCLOSEDTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe link to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3lxmessageTff7b72.Td2a8ffget_destinationTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffhashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff was closedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3lxmessageTff7b72.Td2a8ffset_delivery_destinationTb4b4b4(Tff7b72NoneTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdirect_linksTff7b72.Td2a8ffpopTb4b4b4(Te6edf3delivery_destination_hashTb4b4b4)
Te6edf3lxmessageTff7b72.Td2a8ffnext_delivery_attempt Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3LXMRouterTff7b72.Td2a8ffDELIVERY_RETRY_WAIT
Tff7b72elseTb4b4b4:
T8b949e# Simply wait for the link to become
T8b949e# active or close
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe link to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3lxmessageTff7b72.Td2a8ffget_destinationTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffhashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff is pending, waiting for link to become activeTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72elseTb4b4b4:
T8b949e# No link exists, so we'll try to establish one, but
T8b949e# only if we've never tried before, or the retry wait
T8b949e# period has elapsed.
Tff7b72if Tff7b72not Tffa657hasattrTb4b4b4(Te6edf3lxmessageTb4b4b4, Ta5d6ff"Ta5d6ffnext_delivery_attemptTa5d6ff"Tb4b4b4) Tff7b72or Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3lxmessageTff7b72.Td2a8ffnext_delivery_attemptTb4b4b4:
Te6edf3lxmessageTff7b72.Td2a8ffdelivery_attempts Tff7b72+Tff7b72= T79c0ff1
Te6edf3lxmessageTff7b72.Td2a8ffnext_delivery_attempt Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3LXMRouterTff7b72.Td2a8ffDELIVERY_RETRY_WAIT
Tff7b72if Te6edf3lxmessageTff7b72.Td2a8ffdelivery_attempts Tff7b72< Te6edf3LXMRouterTff7b72.Td2a8ffMAX_DELIVERY_ATTEMPTSTb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3lxmessageTff7b72.Td2a8ffget_destinationTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffEstablishing link to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3lxmessageTff7b72.Td2a8ffget_destinationTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffhashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff for delivery attempt Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3lxmessageTff7b72.Td2a8ffdelivery_attemptsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3lxmessageTff7b72.Td2a8ffget_destinationTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3delivery_link Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Te6edf3lxmessageTff7b72.Td2a8ffget_destinationTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3delivery_linkTff7b72.Td2a8ffset_link_established_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ffprocess_outboundTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdirect_linksTb4b4b4[Te6edf3delivery_destination_hashTb4b4b4] Tff7b72= Te6edf3delivery_link
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffNo path known for delivery attempt Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3lxmessageTff7b72.Td2a8ffdelivery_attemptsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3lxmessageTff7b72.Td2a8ffget_destinationTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffhashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. Requesting path...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Te6edf3lxmessageTff7b72.Td2a8ffget_destinationTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffhashTb4b4b4)
Te6edf3lxmessageTff7b72.Td2a8ffnext_delivery_attempt Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3LXMRouterTff7b72.Td2a8ffPATH_REQUEST_WAIT
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffMax delivery attempts reached for direct Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3lxmessageTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3lxmessageTff7b72.Td2a8ffget_destinationTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8fffail_messageTb4b4b4(Te6edf3lxmessageTb4b4b4)
T8b949e# Outbound handling for messages transported via
T8b949e# propagation to a LXMF router network.
Tff7b72elif Te6edf3lxmessageTff7b72.Td2a8ffmethod Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffPROPAGATEDTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAttempting propagated delivery for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3lxmessageTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3lxmessageTff7b72.Td2a8ffget_destinationTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_node Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffNo outbound propagation node specified for propagated Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3lxmessageTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3lxmessageTff7b72.Td2a8ffget_destinationTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72selfTff7b72.Td2a8fffail_messageTb4b4b4(Te6edf3lxmessageTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3lxmessageTff7b72.Td2a8ffdelivery_attempts Tff7b72<Tff7b72= Te6edf3LXMRouterTff7b72.Td2a8ffMAX_DELIVERY_ATTEMPTSTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_link Tff7b72!= Tff7b72NoneTb4b4b4:
T8b949e# A link already exists, so we'll try to use it
T8b949e# to deliver the message
Tff7b72if Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_linkTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4:
Tff7b72if Te6edf3lxmessageTff7b72.Td2a8ffstate Tff7b72!= Te6edf3LXMessageTff7b72.Td2a8ffSENDINGTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffStarting propagation transfer of Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3lxmessageTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3lxmessageTff7b72.Td2a8ffget_destinationTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffhashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff via Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_nodeTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3lxmessageTff7b72.Td2a8ffset_delivery_destinationTb4b4b4(Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_linkTb4b4b4)
Te6edf3lxmessageTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3lxmessageTff7b72.Td2a8ffrepresentation Tff7b72== Te6edf3LXMessageTff7b72.Td2a8ffRESOURCETb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe transfer of Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3lxmessageTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff is in progress (Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3lxmessageTff7b72.Td2a8ffprogressTff7b72*T79c0ff100Tb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff%Ta5d6ff)Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffWaiting for proof for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3lxmessageTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff sent as link packetTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_linkTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffCLOSEDTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe link to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_nodeTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff was closedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_link Tff7b72= Tff7b72None
Te6edf3lxmessageTff7b72.Td2a8ffnext_delivery_attempt Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3LXMRouterTff7b72.Td2a8ffDELIVERY_RETRY_WAIT
Tff7b72elseTb4b4b4:
T8b949e# Simply wait for the link to become
T8b949e# active or close
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe propagation link to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_nodeTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff is pending, waiting for link to become active: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_linkTff7b72.Td2a8ffstatusTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72elseTb4b4b4:
T8b949e# No link exists, so we'll try to establish one, but
T8b949e# only if we've never tried before, or the retry wait
T8b949e# period has elapsed.
Tff7b72if Tff7b72not Tffa657hasattrTb4b4b4(Te6edf3lxmessageTb4b4b4, Ta5d6ff"Ta5d6ffnext_delivery_attemptTa5d6ff"Tb4b4b4) Tff7b72or Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3lxmessageTff7b72.Td2a8ffnext_delivery_attemptTb4b4b4:
Te6edf3lxmessageTff7b72.Td2a8ffdelivery_attempts Tff7b72+Tff7b72= T79c0ff1
Te6edf3lxmessageTff7b72.Td2a8ffnext_delivery_attempt Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3LXMRouterTff7b72.Td2a8ffDELIVERY_RETRY_WAIT
Tff7b72if Te6edf3lxmessageTff7b72.Td2a8ffdelivery_attempts Tff7b72< Te6edf3LXMRouterTff7b72.Td2a8ffMAX_DELIVERY_ATTEMPTSTb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_nodeTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffEstablishing link to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_nodeTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff for propagation attempt Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3lxmessageTff7b72.Td2a8ffdelivery_attemptsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3lxmessageTff7b72.Td2a8ffget_destinationTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3propagation_node_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_nodeTb4b4b4)
Te6edf3propagation_node_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3propagation_node_identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_link Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Te6edf3propagation_node_destinationTb4b4b4, Te6edf3established_callbackTff7b72=Tff7b72selfTff7b72.Td2a8ffprocess_outboundTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffNo path known for propagation attempt Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3lxmessageTff7b72.Td2a8ffdelivery_attemptsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_nodeTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. Requesting path...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Tff7b72selfTff7b72.Td2a8ffoutbound_propagation_nodeTb4b4b4)
Te6edf3lxmessageTff7b72.Td2a8ffnext_delivery_attempt Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3LXMRouterTff7b72.Td2a8ffPATH_REQUEST_WAIT
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffMax delivery attempts reached for propagated Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3lxmessageTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3lxmessageTff7b72.Td2a8ffget_destinationTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8fffail_messageTb4b4b4(Te6edf3lxmessageTb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────